package com.zyx.nettypro.nio;

import jdk.nashorn.internal.ir.CallNode;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author zyx
 * @since 2021/9/19 15:28
 * desc: MappedByteBuffer可让文件直接在内存(堆外内存)修改, 操作系统不需要拷贝一次
 */
public class BufferMappedByte {
    public static void main(String[] args) throws Exception {

        RandomAccessFile raf = new RandomAccessFile("input/netty/map01.txt", "rw");
        // 获取对应通道
        FileChannel channel = raf.getChannel();

        /*
            参数1： FileChannel.MapMode.READ_WRITE 使用的读写模式
            参数2： 0 可以直接修改的起始位置
            参数3： 5 时映射到内存的大小， 即将文件中的多少个字节映射到内存
                可以直接修改的范围就是0-5
            实际类型： DirectByteBuffer
         */
        MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

        mappedByteBuffer.put(0, (byte) 'W');
        mappedByteBuffer.put(3, (byte) '9');
        // 修改的是大小, 而非索引位置, 尝试修改索引为5的字节时抛出 IndexOutOfBoundsException 异常
        mappedByteBuffer.put(5, (byte) 'Y');

        raf.close();
        System.out.println("修改成功~~");

    }
}
